package com.pig4cloud.pig.auth.support.core;

import com.pig4cloud.pig.auth.support.handler.FormAuthenticationFailureHandler;
import com.pig4cloud.pig.auth.support.handler.SsoLogoutSuccessHandler;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;

/**
 * 表单登录配置类
 * <p>
 * 基于授权码模式的统一认证登录配置，适用于 Spring Security 和 Spring Authorization Server。
 * 主要功能：
 * 1. 配置表单登录页面和处理路径
 * 2. 配置登录失败处理器
 * 3. 配置登出功能和 SSO 登出处理
 * 4. 禁用 CSRF 保护（OAuth2 使用令牌保护）
 *
 * @author lengleng
 * @date 2025/05/30
 */
public final class FormIdentityLoginConfigurer
		extends AbstractHttpConfigurer<FormIdentityLoginConfigurer, HttpSecurity> {

	/**
	 * 初始化表单登录配置
	 * <p>
	 * 配置说明：
	 * - 登录页面：/token/login
	 * - 登录处理路径：/oauth2/form
	 * - 登出路径：/oauth2/logout
	 * - 清除 JSESSIONID cookie
	 * - 使 HTTP session 失效
	 * 
	 * @param http HTTP 安全配置对象
	 * @throws Exception 配置过程中的异常
	 */
	@Override
	public void init(HttpSecurity http) throws Exception {
		http.formLogin(formLogin -> {
			formLogin.loginPage("/token/login");  // 设置自定义登录页面
			formLogin.loginProcessingUrl("/oauth2/form");  // 设置表单提交地址
			formLogin.failureHandler(new FormAuthenticationFailureHandler());  // 设置登录失败处理器

		})
			.logout(logout -> logout.logoutUrl("/oauth2/logout")  // 配置登出路径
				.logoutSuccessHandler(new SsoLogoutSuccessHandler())  // SSO 登出成功处理器
				.deleteCookies("JSESSIONID")  // 删除会话 cookie
				.invalidateHttpSession(true)) // 使 HTTP session 失效

			.csrf(AbstractHttpConfigurer::disable);  // 禁用 CSRF，OAuth2 使用令牌验证
	}

}
